package jp.anago_dev.takarush_helper.net;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import org.json.JSONException;
import org.json.JSONObject;

import android.support.v4.content.ModernAsyncTask;

/**
 * Http通信を行います。
 * 
 * @author anago_dev
 * 
 */
public final class HttpConnector {

    /**
     * エラーコード
     */
    public enum Error {
        /** 接続エラー */
        ERROR_CONNECTION,
        /** JSONパースエラー */
        ERROR_JSON_PARSE,
    }

    /** ベースURL */
    public static final String BASE_URL = "http://takarashhelper.appspot.com";

    /** HTTPリクエストのタイムアウト時間 */
    public static final int HTTP_REQUEST_TIMEOUT_MS = 30 * 1000;

    /** 読み込みのタイムアウト時間 */
    public static final int HTTP_READ_TIMEOUT_MS = 30 * 1000;

    /** 通信結果通知リスナ */
    private HttpConnectionListener mListener;

    /** 非同期でのHTTP通信サポートオブジェクト */
    private AsynkHttpConnection mAsynkHttpConnection;

    /**
     * コンストラクタ
     * 
     * @param listener
     *            {@link HttpConnectionListener}オブジェクト
     */
    public HttpConnector(final HttpConnectionListener listener) {
        mListener = listener;
    }

    /**
     * 通信を実行します。
     */
    public void execute() {

        mAsynkHttpConnection = new AsynkHttpConnection();
        mAsynkHttpConnection.execute(null, null, null);

    }

    /**
     * 通信をキャンセルします。
     */
    public void cancel() {
        if (mAsynkHttpConnection != null && mAsynkHttpConnection.isCancelled()) {
            mAsynkHttpConnection.cancel(true);
        }
    }

    /**
     * 非同期で通信処理を行います。
     * 
     * @author anago_dev
     * 
     */
    private class AsynkHttpConnection extends ModernAsyncTask<Void, Void, JSONObject> {

        /** 通信接続オブジェクト */
        private HttpURLConnection mUrlConnection;

        /**
         * 通信を行い、{@link JSONObject}にパースします。<br/> {@link JSONObject}
         * がnullかどうかで通信の成功・失敗を判定します。
         * 
         * @see android.support.v4.content.ModernAsyncTask#doInBackground(Params[])
         */
        @Override
        protected JSONObject doInBackground(final Void... arg0) {

            JSONObject jsonObject = null;

            try {
                URL url = new URL(BASE_URL + "/takarushhelpergae");
                mUrlConnection = (HttpURLConnection) url.openConnection();
                mUrlConnection.setConnectTimeout(HTTP_REQUEST_TIMEOUT_MS);
                mUrlConnection.setReadTimeout(HTTP_READ_TIMEOUT_MS);

                // リクエスト
                InputStream inputStream = mUrlConnection.getInputStream();

                if (inputStream != null) {
                    BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
                    jsonObject = new JSONObject(br.readLine());
                }

            } catch (MalformedURLException e) {
            } catch (IOException e) {
            } catch (JSONException e) {
            } finally {
                mUrlConnection.disconnect();
            }

            return jsonObject;
        }

        @Override
        protected void onPostExecute(final JSONObject result) {
            super.onPostExecute(result);
            if (mListener != null) {
                // 通信完了
                if (result != null) {
                    mListener.onComplete(result);
                }
                // 通信失敗
                else {
                    mListener.onFail(HttpConnector.Error.ERROR_CONNECTION);
                }
            }

        }

        @Override
        protected void onCancelled() {
            super.onCancelled();

            mUrlConnection.disconnect();

        }

    }

}
